package componentes;

import java.awt.image.BufferedImage;
import java.util.ArrayList;

import com.uqbar.metalGear.MGSScene;
import com.uqbar.vainilla.DeltaState;
import com.uqbar.vainilla.GameComponent;
import com.uqbar.vainilla.appearances.Sprite;

import comportamiento.Abajo;
import comportamiento.Arriba;
import comportamiento.ControlesPJ;
import comportamiento.Derecha;
import comportamiento.EstrategiaRecorrido;
import comportamiento.Izquierda;
import comportamiento.Recorrido;
import comportamiento.StateDireccion;

public class Soldado extends Componente{

	private ControlesPJ controles;
	private StateDireccion direccion;
	private Boolean cambioDir;
	private double velocidad;
	private double velocidadSoldado;
	private double xAnterior;
	private double yAnterior;
	private double x2Anterior;
	private double y2Anterior;
	private DeltaState deltaState;
	private EstrategiaRecorrido recorrido;
	
	private ArrayList<Espera> esperas;
	
	private ArrayList<Coordenada> coordenadas;
	
	public Soldado(int x, int y, BufferedImage imagen, double velocidad, ControlesPJ controles, 
			double velocidadSoldado, StateDireccion direccion, EstrategiaRecorrido recorrido, ArrayList<Espera> esperas){
		
		super(x, y, imagen, controles, velocidad);
		
		this.setZ(5);
		
		this.velocidad = velocidad;
		this.controles = controles;
		this.velocidadSoldado = velocidadSoldado;
		this.direccion = direccion;
		this.recorrido = recorrido;
		this.cambioDir = false;
		
		this.coordenadas = coordenadas;
		
		this.esperas = esperas;
	}
	
	@Override
	public void update(DeltaState deltaState) {
		
		this.getRecorrido().controlRecorrido(this);
		if(this.getRecorrido().getEstaEnMovimiento()){
			
			this.setX2Anterior(this.getxAnterior());
			this.setY2Anterior(this.getyAnterior());
			
			super.update(deltaState);			
			this.libre(deltaState.getDelta());
			this.deltaState = deltaState;
			
		}
		else{
			super.update(deltaState);
		}
		//this.getRecorrido().controlRecorrido(this);
		// nuevo
		
		//intentar lo mismo pero con coordenadas
		
		/*this.getRecorrido().controlCoordenadas(this);
		if(this.getRecorrido().getEstaEnMovimiento()){
			super.update(deltaState);			
			this.libre(deltaState.getDelta());
			this.deltaState = deltaState;
		}
		else{
			super.update(deltaState);
		}
		this.updateCoordenadas(deltaState);*/
	}
	
	// coordenadas
	
	public void updateCoordenadas(DeltaState deltaState){
		for(Coordenada c : this.getCoordenadas()){
			c.update(deltaState, this.getScene());
		}
	}
	
	public void retrocederCoordenadas(){
		for(Coordenada c : this.getCoordenadas()){
			c.retroceder();
		}
	}
	
	public Boolean hayColisionConCoordenada(){
		Boolean colisiona = false;
		for(Coordenada c : this.getCoordenadas()){
			if( ((int)this.getX() == (int)c.getCx()) && ((int)this.getY() == (int)c.getCy()) ){
				colisiona = true;
			}
		}
		return colisiona;
	}
	
	// esperas
	
	public Boolean hayColisionConEspera(){
		Boolean colisiona = false;
		//for(Espera esp : this.getScene().getEsperas()){
		for(Espera esp : this.esperas){
			colisiona = colisiona || esp.hayColision(this);
		}
		return colisiona;
	}
	
	public void libre(double delta) {
		this.direccion.movimientoLibre(this, delta);
	}
	
	public void libreColisionando(){
		this.direccion.xLibreConColision(this, this.deltaState.getDelta());
		this.direccion.yLibreConColision(this, this.deltaState.getDelta());
	}
	
	// accesos

	public double getVelocidadSoldado() {
		return velocidadSoldado;
	}

	public void setVelocidadSoldado(double velocidadSoldado) {
		this.velocidadSoldado = velocidadSoldado;
	}

	public EstrategiaRecorrido getRecorrido() {
		return recorrido;
	}

	public void setRecorrido(EstrategiaRecorrido recorrido) {
		this.recorrido = recorrido;
	}

	public void setDireccion(Derecha derecha) {
		// TODO Auto-generated method stub
		this.direccion = derecha;
	}

	public void setDireccion(Izquierda izquierda) {
		// TODO Auto-generated method stub
		this.direccion = izquierda;
	}

	public void setDireccion(Abajo abajo) {
		// TODO Auto-generated method stub
		this.direccion = abajo;
	}

	public void setDireccion(Arriba arriba) {
		// TODO Auto-generated method stub
		this.direccion = arriba;
	}

	public Boolean getCambioDir() {
		return cambioDir;
	}

	public void setCambioDir(Boolean cambioDir) {
		this.cambioDir = cambioDir;
	}

	public ArrayList<Coordenada> getCoordenadas() {
		return coordenadas;
	}

	public void setCoordenadas(ArrayList<Coordenada> coordenadas) {
		this.coordenadas = coordenadas;
	}

	public double getX2Anterior() {
		return x2Anterior;
	}

	public void setX2Anterior(double x2Anterior) {
		this.x2Anterior = x2Anterior;
	}

	public double getY2Anterior() {
		return y2Anterior;
	}

	public void setY2Anterior(double y2Anterior) {
		this.y2Anterior = y2Anterior;
	}

	public StateDireccion getDireccion() {
		return direccion;
	}

	public void setDireccion(StateDireccion direccion) {
		this.direccion = direccion;
	}
	
	
}
